package com.pronosticnews.client.admin.view.editJoueur;

import java.io.IOException;
import java.util.Date;
import java.util.List;

import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.text.shared.Renderer;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.ValueListBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler;
import com.google.gwt.user.datepicker.client.DateBox;
import com.pronosticnews.client.admin.resources.PronosticnewsAdminMessages;
import com.pronosticnews.client.admin.resources.PronosticnewsAdminResources;
import com.pronosticnews.client.util.DateUtil;
import com.pronosticnews.shared.model.ClubDto;
import com.pronosticnews.shared.model.JoueurDto;

public class EditJoueurViewImpl extends Composite implements EditJoueurView {

	interface EditJoueurUiBinder extends UiBinder<Widget, EditJoueurViewImpl> {
	}

	private Presenter presenter;
	
	@UiField
	TextBox txtImage;
	
	@UiField
	Image imgPhoto;

	@UiField
	FormPanel form;

	@UiField
	FileUpload uplImage;

	@UiField
	TextBox txtNom;

	@UiField
	TextBox txtPrenom;

	@UiField
	DateBox txtDateNaissance;

	@UiField
	TextBox txtTaille;

	@UiField
	TextBox txtPoids;

	@UiField(provided = true)
	ValueListBox<ClubDto> lstClub = new ValueListBox<ClubDto>(
			new Renderer<ClubDto>() {

				@Override
				public String render(ClubDto club) {
					return club.getNom();
				}

				@Override
				public void render(ClubDto object, Appendable appendable)
						throws IOException {
				}
			});

	@UiField
	Label lblTitle;

	@UiField
	HorizontalPanel panNouveau;

	@UiField
	HorizontalPanel panModifier;

	@UiField
	VerticalPanel containerForm;

	@UiField(provided=true)
	PronosticnewsAdminResources res;

	PronosticnewsAdminMessages messages;
	
	private JoueurDto editJoueur;

	private final Integer logoSize = 100;

	public EditJoueurViewImpl() {
		messages = GWT.create(PronosticnewsAdminMessages.class);
		res = GWT.create(PronosticnewsAdminResources.class);
		res.cssFormEdition().ensureInjected();
		initWidget(GWT.<EditJoueurUiBinder> create(EditJoueurUiBinder.class)
				.createAndBindUi(this));
		lblTitle.addStyleName(res.cssFormEdition().title_creation());
		txtDateNaissance.setFormat(new DateBox.DefaultFormat(
				DateUtil.DATE_FORMAT_FR));
		initForm();
		}

		private void initForm() {
			form.setAction(com.google.gwt.core.client.GWT.getHostPageBaseURL()+"image/");
			form.addSubmitCompleteHandler(new SubmitCompleteHandler() {
				@Override
				public void onSubmitComplete(SubmitCompleteEvent event) {
					try {					
						Integer idImage = Integer.parseInt(event.getResults().replace("<pre>", "").replace("</pre>", ""));
						if (idImage != null) {
							editJoueur.setPhoto(idImage);
						}
						presenter.submit(editJoueur);
					} catch (Exception e) {
					}
				}
			});
		}

	@Override
	public void setPresenter(Presenter presenter) {
		this.presenter = presenter;
	}

	@Override
	public void submitComplete() {
		clearFormulaire();
	}

	void clearFormulaire() {
		imgPhoto.setVisible(false);
		txtImage.setText("");
		txtImage.setValue("");
		txtPrenom.setValue("");
		txtNom.setValue("");
		txtPoids.setValue("");
		txtTaille.setValue("");
		txtDateNaissance.setValue(new Date());
	}

	@Override
	public void setJoueur(JoueurDto existingJoueur) {
		if (existingJoueur.getPhoto() != null) {
			txtImage.setText(existingJoueur.getPhoto().toString());
			imgPhoto.setUrl(com.google.gwt.core.client.GWT.getHostPageBaseURL()+"image/?id=" + existingJoueur.getPhoto()+"&height="+logoSize);
			imgPhoto.setVisible(true);
		}
		txtNom.setText(existingJoueur.getNom());
		txtPrenom.setValue(existingJoueur.getPrenom());
		txtPoids.setValue(existingJoueur.getPoids().toString());
		txtTaille.setValue(existingJoueur.getTaille().toString());
		txtDateNaissance.setValue(existingJoueur.getDateNaissance());
	}

	@Override
	public void setModeModification(boolean mode) {
		panNouveau.setVisible(!mode);
		panModifier.setVisible(mode);
		clearFormulaire();
		if (mode) {
			lblTitle.setText(messages.modifier_joueur());
			lblTitle.addStyleName(res.cssFormEdition().title_modif());
			lblTitle.removeStyleName(res.cssFormEdition().title_creation());
		} else {
			lblTitle.setText(messages.enregistrer_joueur());
			lblTitle.addStyleName(res.cssFormEdition().title_creation());
			lblTitle.removeStyleName(res.cssFormEdition().title_modif());
		}
	}

	@UiHandler({ "btEnregistrer", "btModifier" })
	void onClick(ClickEvent event) {
		editJoueur = new JoueurDto();
		editJoueur.setNom(txtNom.getValue());
		editJoueur.setPrenom(txtPrenom.getValue());
		editJoueur.setDateNaissance(txtDateNaissance.getValue());
		editJoueur.setPoids(Integer.parseInt(txtPoids.getValue()));
		editJoueur.setTaille(Integer.parseInt(txtTaille.getValue()));
		editJoueur.setClub(lstClub.getValue());
		if (!"".equals(uplImage.getFilename())) {
			form.submit();
		}
		else {
			presenter.submit(editJoueur);
		}		
		setModeModification(false);
	}

	@UiHandler("refreshClub")
	void onClickRefreshCub(ClickEvent event) {
		presenter.getClubs();
	}

	@UiHandler("btAnnuler")
	void doClickAnnuler(ClickEvent event) {
		setModeModification(false);
		presenter.annuleModification();
	}

	@Override
	public void setClubs(List<ClubDto> clubs) {
		for (ClubDto clubDto : clubs) {
			lstClub.setValue(clubDto);
		}
	}

}
